/**
 * DMon.java
 *
 * @author Alex Tough (07-41604)
 * @author Carlos Colmenares (06-39380)
 *
 * Interfaz que define el comportamiento de una clase DMon,
 * la cual se encarga de monitorear el comportamiento de
 * los procesos DRep y DCLI.
 */
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface DMon extends Remote {

    /**
     * Este proceso reporta al DMon que un DCLI ha
     * subido un archivo a un DRep, operación que es guardada
     * en una base de datos
     * @throws RemoteException En caso de una falla de conexión.
     */
    public void subir() throws RemoteException;

    /**
     * Este proceso reporta al DMon que un DCLI ha
     * bajado un archivo a un DRep, operación que es guardada
     * en una base de datos
     * @throws RemoteException En caso de una falla de conexión.
     */
    public void bajar() throws RemoteException;

    /**
     * Retorna una lista con todos los usuarios conectados a algún
     * DRep que esté registrado en este DMon
     *
     * @return Una lista con el formato "NombreUsuario HostDRep:PuertoDRep"
     *         por cada usuario conetado al DMon de este DRep.
     * @throws RemoteException En caso de una falla de conexión.
     */
    public String[] tuser() throws RemoteException;

    /**
     * Indica el numero de todos los programas drep que están activos en 
     * el sistema (regustados a este DMon).
     *
     * @return El numero de programas drep que estan activos en el sistema.
     *
     * @throws RemoteException En caso de una falla de conexión.
     */
    public int nrep() throws RemoteException;

    /**
     * Se registra a un proceso DRep en este DMon bajo el
     * nombre dado.
     * @param nombreDeDRep El identificador único del DRep que va a
     *                     conectarse.
     * @throws RemoteException En caso de una falla de conexión.
     * @throws DMonException Si ya existe un DRep registrado con ese nombre
     */
    public void registrarDRep(String nombreDeDRep)
        throws RemoteException, DMonException;

    /**
     * Esta operación confirma que se ha registrado un usuario en
     * el DRep indicado por host y puerto.
     * @param nombreDeUsuario El nombre del usuario que va a conectarse
     * @param nombreDeDRep El identificador único del DRep al cuál se
     *                    conecta el usuario
     * @throws RemoteException En caso de una falla de conexión.
     * @throws DMonException En caso de que ya exista un usuario con ese
     *          nombre en ese DRep
     */
    public void registrarDCLI(String nombreDeUsuario, String nombreDeDRep)
        throws RemoteException, DMonException;

    /**
     * Esa operación indica que un proceso DRep ha terminado, lo que
     * lo extrae de la base de datos.
     * @param nombreDeDRep El nombre del proceso DRep el cuál se desconecta
     * @throws RemoteException En caso de una falla de conexión.
     * @throws DMonException Si no existe un DRep registrado con ese nombre
     */
    public void desconectarDRep(String nombreDeDRep)
        throws RemoteException, DMonException;

    /**
     * Esta operación indica que un usuario ha terminado sesión en
     * su respectivo DRep, este usuario es sacado de la Base de Datos.
     * @param nombreDeUsuario El nombre del usuario que se desconecta
     * @param nombreDeDRep El nombre del DRep al que pertenece el usuario
     * @throws RemoteException En caso de una falla de conexión.
     * @throws DMonException Si no existe un usuario con ese nombre
     *         registrado en ese DRep
     */
    public void desconectarDCLI(String nombreDeUsuario, String nombreDeDRep)
        throws RemoteException, DMonException;

}
